#include "DynamicArray.h"
#include <stdio.h>
#include <string.h>

struct Student // 结构体名：Student
{
    int id;     // 学号
    char *name; // 姓名
};
typedef struct Student Stu;

Stu *CreateStu(int id, const char *name)
{
    Stu *s = (Stu *)malloc(sizeof(Stu));
    if (s == NULL)
    {
        printf("CreateStu malloc error!\n");
        exit(-1);
    }
    s->id = id;
    s->name = strdup(name); // 堆上的字符串
    return s;
}

void ClearStu(void *p)
{
    Stu *s = (Stu *)p;
    free(s->name);
    free(s);
}

void ClearClass(void *p)
{
    DArray *a = (DArray *)p;
    ClearDArray(a, ClearStu);
} // 释放的时候从Stu开始（由小到大）

// 回调函数 作为参数传递到动态数组中
void PrintStu(void *p)
{
    Stu *s = (Stu *)p;
    printf("学生学号：%d 学生姓名：%s\n", s->id, s->name);
} // 打印学生的函数

bool IsNameEqual(void *p1, void *p2)
{
    Stu *s = (Stu *)p1;
    const char *name = (const char *)p2;
    return strcmp(s->name, name) == 0;
}

bool IsIDEqual(void *p1, void *p2)
{
    Stu *s = (Stu *)p1;
    long id = (long)p2;
    return s->id == id;
}

void PrinfClass(void *p)
{
    DArray *a = (DArray *)p;
    printf("班级： \n");
    PrintDArray(a, PrintStu);
}

void Split(DArray *a, const char *str, const char *delim)
{
    char *temp = strdup(str); // 先找个临时变量
    char *dest = strtok(temp, delim);
    while (dest != NULL)
    {
        InsertDArray(a, strdup(dest)); // 直接用dest会被释放掉
        dest = strtok(NULL, delim);
    }
    free(temp); //
}

void PrintString(void *p)
{
    printf("%s\n", (char *)p);
} // 接收void *类型的指针作为参数，可以传递任何类型的指针，不过会被强转为(char*)类型

bool BiggerID(void *p1, void *p2)
{
    Stu *s1 = (Stu *)p1;
    Stu *s2 = (Stu *)p2;
    return s1->id > s2->id;
}

int BiggerName(void *p1, void *p2)
{
    Stu *s1 = (Stu *)p1;
    Stu *s2 = (Stu *)p2;
    return strcmp(s1->name, s2->name) > 0;
}

int Idcmp(void *p1, void *p2)
{
    Stu *s1 = (Stu *)p1;
    return s1->id - (long)p2;
}

int NAMEcmp(void *p1, void *p2)
{
    Stu *s1 = (Stu *)p1;
    return strcmp(s1->name,(const char*)p2);
}

int main()
{
    // DArray a;   //封装后不能直接定义结构体了
    // A.a = NULL;
    // DArray* a;  //需定义结构体指针，

    // DArray *a = InitDArray();
    //  InsertDArray(a, CreateStu(1, "张三"));
    // InsertDArray(a, CreateStu(2, "李四"));
    // InsertDArray(a, CreateStu(3, "李五"));

    // void *s = FindByElement(a, "李1四", IsNameEqual);
    // void *s = FindByElement(a, (void *)1, IsIDEqual);
    // if (s)
    // {
    //     PrintStu(s);
    // }
    // else
    // {
    //     printf("没找到\n");
    // }
    // void *s = RemoveDArray(a,(void *)4,IsIDEqual);
    // if(s)
    // {
    //     printf("删除的学生是：");
    //     PrintStu(s);
    //     ClearStu(s);
    // }
    // else
    // {
    //     printf("没找到，没删除\n");
    // }
    // PrintDArray(a, PrintStu);
    // ClearDArray(a, ClearStu);

    // DArray *class1 = InitDArray();
    // InsertDArray(class1, CreateStu(1, "张三"));
    // InsertDArray(class1, CreateStu(2, "李四"));
    // InsertDArray(class1, CreateStu(3, "李五"));

    // DArray *class2 = InitDArray();
    // InsertDArray(class2, CreateStu(4, "张六"));
    // InsertDArray(class2, CreateStu(5, "李五"));
    // InsertDArray(class2, CreateStu(6, "王八"));

    // DArray *school = InitDArray();
    // InsertDArray(school, class1);
    // InsertDArray(school, class2);

    // PrintDArray(school,PrinfClass);
    // ClearDArray(school,ClearClass);

    // 字符串切割  字符串列表
    // DArray *a = InitDArray();
    // Split(a,"zhangsan,lisi,wangwu",",");
    // //打印字符串数组
    //  PrintDArray(a,PrintString);
    // ClearDArray(a,free);

    DArray *a = InitDArray();
    InsertDArray(a, CreateStu(3, "zh"));
    InsertDArray(a, CreateStu(1, "lisi"));
    InsertDArray(a, CreateStu(2, "wangwu"));

    FastSort(a, BiggerID);
    //void *s = BinarySearch(a, "lisi",NAMEcmp);
    void *s = BinarySearch(a,(void*)3,Idcmp);
    if(s)
    {
        printf("找到了\n");
        PrintStu(s);
    }
    else
    {
        printf("没找到\n");
    }
    // FastSort(a,BiggerName);
    //PrintDArray(a, PrintStu);

    return 0;
}
